import pandas as pd

'''

数据清洗是对一些没有用的数据进行处理的过程。

很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况，如果要使数据分析更加准确，就需要对这些没有用的数据进行处理。

在这个教程中，我们将利用 Pandas包来进行数据清洗。

本文使用到的测试数据 property-data.csv:input/property-data.csv

包含了四种空数据：

n/a
NA
—
na

'''







'''
Pandas 清洗空值
如果我们要删除包含空字段的行，可以使用 dropna() 方法，语法格式如下：

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明：

axis：默认为 0，表示逢空值剔除整行，如果设置参数 axis＝1 表示逢空值去掉整列。
how：默认为 'any' 如果一行（或一列）里任何一个数据有出现 NA 就去掉整行，如果设置 how='all' 一行（或列）都是 NA 才去掉这整行。
thresh：设置需要多少非空值的数据才可以保留下来的。
subset：设置想要检查的列。如果是多个列，可以使用列名的 list 作为参数。
inplace：如果设置 True，将计算得到的值直接覆盖之前的值并返回 None，修改的是源数据。
我们可以通过 isnull() 判断各个单元格是否为空。
'''



filePath = '/Users/yujiahao/02_Xizhi/日常学习（私人勿动）/code/My_Python/input/property-data.csv'

df = pd.read_csv(filePath)

print (df['NUM_BEDROOMS'])
print('----------------------分割线☆分割线----------------------------')
print (df['NUM_BEDROOMS'].isnull())
print('----------------------分割线☆分割线----------------------------')

# 这里要结合样例数据来看，pandas会把表里面的字符串 n/a 和 NA 当作空数据，na 不是空数据，不符合我们要求，我们可以指定空数据类型：
missing_values = ["n/a", "na", "--"]
df = pd.read_csv(filePath,na_values=missing_values)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())

# 删除包含空数据的行，就只有第一行符合要求没有被删除，
# 如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数:
# new_df = df.dropna(inplace = True)

# 注意：默认情况下，dropna() 方法返回一个新的 DataFrame，不会修改源数据。所以下面是nono
# print(new_df.to_string())
print(df.to_string())



# df.dropna(subset=['ST_NUM'], inplace = True)

print('移除 ST_NUM 列中字段值为空的行：' + df.to_string())







df.fillna(12345, inplace = True)

print('使用 12345 替换空字段：' + df.to_string())


# 我们也可以指定某一个列来替换数据：





df['PID'].fillna(12345, inplace = True)

print('使用 12345 替换 PID 为空数据：' + df.to_string())


# 替换空单元格的常用方法是计算列的均值、中位数值或众数。

# Pandas使用 mean()、median() 和 mode() 方法计算列的均值（所有值加起来的平均值）、中位数值（排序后排在中间的数）和众数（出现频率最高的数）。


print('---------------------------------------------分割线--------------------------------------------------')
# 实例
# 使用 mean() 方法计算列的均值并替换空单元格：



x = df["ST_NUM"].mean()

df["ST_NUM"].fillna(x, inplace = True)

print(df.to_string())




# 第三个日期格式错误


# 定义数据，其中包含多种日期格式
data = {
    "Date": ['2020/12/01', '2020-12-02', '12/03/2020', '04-12-2020', '20201205', '1607107200'],
    "duration": [50, 40, 45, 35, 30, 25]
}

# 创建 DataFrame
df = pd.DataFrame(data, index=["day1", "day2", "day3", "day4", "day5", "day6"])

# 将 'Date' 列转换为日期格式，处理不同的日期格式和时间戳
df['Date'] = pd.to_datetime(df['Date'], errors='coerce', infer_datetime_format=True )

print(df)





# 定义数据，其中包含时间戳
data = {
    "Timestamp": [1607107200, 1607193600, 1607280000, 1607366400],
    "duration": [50, 40, 45, 35]
}

# 创建 DataFrame
df = pd.DataFrame(data)

# 将 'Timestamp' 列转换为日期时间格式
df['Date'] = pd.to_datetime(df['Timestamp'], unit='s')

print(df)
